package com.yan.utils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * TODO
 *
 * @Author: 汪焰
 * @Date: 2021/5/26 21:26
 */
public class ProxyUtils {

    public static <T> T proxy(T o) {
        System.out.println("当前代理的类名" + o.getClass().getSimpleName());
        System.out.println("当前代理的全限定类名" + o.getClass().getName());


        return (T) Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                for (int i = 0; i < args.length; i++) {
                    if (args[i] instanceof Integer) {
                        System.out.println("  代理方法 传入参数   " + i + "         " + args[i]);
                    }
                }


                System.out.println("开始执行     代理方法");

                long startTime = System.currentTimeMillis();
                Object invoke = method.invoke(o, args);
                long time = System.currentTimeMillis() - startTime;


                System.out.println("执行方法耗时：" + time + "      返回结果：" + invoke);

                System.out.println("代理方法    执行结束");
                return invoke;
            }
        });
    }

}
